package cn.edu.ecut.java.oop;
/**
 * 1、类体( class body )中可以声明:
 *       类初始化器(StaticInitializers) [即你们所说的 静态代码块 ]
 *       实例初始化器(InstanceInitializers) [即你们所说的 普通代码块 ]
 *       成员变量( member variable ) [即你们说的属性(反对这样说)]
 *       成员方法( member method )
 *       构造方法( constructor )
 *       内部类 (包括枚举，枚举是一种特殊的类)
 *       内部接口 (包括注解，注解是一种特殊的接口)
 * 2、类的成员(member)仅包括:
 *      字段( field ) 即 成员变量( member variable )
 *      方法( method ) 即 成员方法( member method )
 *      内部类(包括枚举 )
 *      内部接口( 包括注解 )
 */

public class Monkey {

    // 成员变量( member variable ) 也被称作 字段 (field)
    private String name ; // 没有 static 修饰的就是属于实例的
    private char gender ;
    private int age ;

    // 构造方法( constructor )
    public Monkey(String name, char gender, int age) {
        super();
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    // 成员方法( member method )
    public static void main(String[] args) {
        //声明一个Monkey类型名称为 m 的引用变量
        Monkey m = null ; // 这里为 引用变量 m 赋的值 是 null
        System.out.println( m );

        // 创建好 Monkey 对象之后，将 堆区域中 Monkey 对象地址赋值给 引用变量 m
        m = new Monkey( "孙悟空" , '男' , 500 );
        System.out.println( m );
        System.out.println( m.toString() ); // toString方法返回的是对象的字符串形式

        // System.identityHashCode 可以获取任意引用变量所指向的对象在内存中的地址转换而来的惟一的整数
        // System.identityHashCode 方法所返回的并不是内存地址，而是根据内存地址转换而来的一个整数
        int hash = System.identityHashCode( m ); // 因为该方法返回的整数是惟一的，因此可以近似地当做"地址"来理解
        System.out.println( hash );

        System.out.println( "- - - - - - -" );

        String s = "hello" ;
        System.out.println( s );
        System.out.println( s.toString() );
        System.out.println( System.identityHashCode( s ) );

    }

    // 成员方法( member method )
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}
